package com.flong.spring.config;

import com.flong.spring.dao.StudentDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @Author:liangjl
 * @Date: 2020/6/11-21:09
 * @Eamil:jilongliang@sina.com
 * @Description:
 *
 * 一、自动装配
 * Spring 利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值
 * 1、默认优先按照类型去容器中找对应的组件applicationContext.getBean(StudentDao.class);
 * 2、如果找到多个相同类型的组件，再将属性的名称作为组件id去容器中查找 applicationContext.getBean("studentDao");
 * 3、@Qualifier("studentDao1") 使用@Qualifier指定需要装配的组件的id，而不是使用属性名
 * 4、自动装配默认一定要将属性赋值好，没有就会报错，可以使用@Autowired(requeired=false)
 * 5、@Primary 让Spring进行自动装配的时候，默认使用首选的bean,也可以继续使用@Qualifier指定需要装配的bean的名字
 *
 * 二、Spring支持使用@Resource(JSR250)和Inject(JSR330)
 * @Resource 可以和@Autowired一样实现自动装配功能，默认是按照组件名称进行装配的，没有能支持@Primary 功能没有支持@Autowired(requeired=false)
 * @Inject 使用它需要导入javax.inject这个jar，没@Autowired
 *
 * 三、@Autowired  构造器，参数，方法，属性，都是从容器中获取参数组件的值
 *  1、标注在方法位置、@Bean+方法参数，参数从容器获取
 *  2、标在构造器上，如果组件只有一个有参构造方器，这个参数构造方法的 @Autowired可以省略，参数位置的组件还是可以自动从容器中获取
 *  3、放在参数位置
 */

@Configuration
@ComponentScan({"com.flong.spring.service","com.flong.spring.dao","com.flong.spring.controller"})
public class ConfigOfAutowired {


    @Primary
    @Bean("studentDao1")
    public StudentDao studentDao(){
        return new StudentDao();
    }
}
